/*
 * @描述: 
 * @创建者: kilomChou
 * @Date: 2021-04-11 16:57:19
 * @最后编辑: kilomChou
 * @LastEditTime: 2021-05-15 14:08:17
 */
import { RandUtil } from "../../util/RandUtil";
import { Util } from "../../util/Util";
import { VFood } from "../../data/XlsxVo";
import { IAngCircle, Vec2 } from "../../core/vec2/Vec2";
import CircleEntity from "../entity/CircleEntity";
const [util, ru, v2] = [Util, RandUtil, Vec2];

/** 食物类 */
export default class Food extends CircleEntity {

    /** 奖励分 */
    score: number;
    /** 食物类型 */
    type: FoodType;
    /** 是否存在世界中 */
    isLive: Boolean;
    /** 颜色整型(没有则为随机颜色) */
    rgb: number;
    /** 颜色字符串(没有则为随机颜色) */
    color: string;
    /** 清除时间 */
    clearTime: number

    /** 初始化食物 */
    init(init: IFoodInit) {
        v2.angCirAs(this, init);
        this.setScore(init.score);
        this.type = init.type || FoodType.normal;
        this.color = init.color;
        this.rgb = init.color ? util.color2rgb(this.color) : 0;
    }

    onAdded() {
        this.isLive = true;
        if (this.type == FoodType.snake) {
            //设置战利品食物清除时间
            this.clearTime = this.timer.time + ru.rand2(VFood.cfg.clearTime);
        }
    }

    onRemoved() {
        this.isLive = false;
    }

    /** 设置分数 */
    setScore(score?: number) {
        if (score) {
            this.score = score;
        } else {
            this.randScore();
        }
        this.updateWidth();
    }

    /** 随机分数 */
    randScore() {
        return this.score = ru.chance(ru.rand2(VFood.cfg.superFoodChance)) ?
            ru.rand2(VFood.cfg.superFoodScore) : ru.rand2(VFood.cfg.score);
    }

    /** 更新宽度 */
    updateWidth() {
        //分数决定宽度
        this.w = 6.66 + Math.pow(this.score, 0.33) * 4.44;
    }

    /** 被吃 */
    eaten(eaterId: number) {
        this.world.foodMgr.removeFood(this, eaterId);
    }

}

/** 食物类型 */
export const enum FoodType {
    /** 普通食物 */
    normal,
    /** 战利品食物 */
    snake,
}

/** 食物初始化参数 */
export interface IFoodInit extends IAngCircle {
    /** 食物类型 */
    type?: FoodType,
    /** 奖励分 */
    score?: number,
    /** 颜色字符串 */
    color?: string,
}